package chapter06

/**
 * 特质的叠加问题
 *
 * 对于父类或者特质都拥有的属性和方法都拥有的方法
 *
 * 子类去使用的必须要重写，来达到解决冲突的问题
 * 如果在方法里使用super关键字，他针对的是哪个特征或者父类的方式
 */
object Test15_TraitOverlying {
  def main(args: Array[String]): Unit = {
//    var s = new Student15
//    s.increase()

    // 钻石问题的叠加
    val myFootBall = new MyFootBall
    println(myFootBall.describe())
    // print  my ball is yellow-foot-ball
    // 很明显，名字都输出了 且是一个叠加的状态

    // class MyBall extends Category with Color
    // 叠加顺序 MyClass -> Color -> Category -> Ball
    /*
    * 1.列出第一个特质 Category 的继承关系，作为临时叠加顺序
    * 2.列出混入的第二个特质，Color的集成关系，并将该顺序叠加到临时
    * 顺序前面，已出现的特质不再重复
    * 3.将子类MyBall放在临时叠加顺序的第一个，得到最终的叠加顺序
    * */
  }
}

// 钻石叠加问题，就是针对trait特质和特质的继承问题

// 定义球类特征
trait Ball{
  def describe():String = "ball"
}
// 定义颜色特征
trait ColorBall extends Ball{
  var color = "yellow"
  override def describe(): String = color+"-"+super.describe()
}

// 颜色种类
trait CategoryBall extends Ball{
  var cactegory :String = "foot"

  override def describe(): String = cactegory+"-"+super.describe()
}

// 定义一个自定义球类的

class MyFootBall extends CategoryBall with ColorBall{
  override def describe(): String = " my ball is "+super.describe()
}

// 再定义一个特征
trait Knowledge15{

  var amount :Int = 0
  def increase():Unit

}

trait Talent15 {
  def singing():Unit
  def dancing():Unit
}

class Student15 extends Person13 with Talent15
  with Knowledge15{


  override def singing(): Unit = {

  }

  override def dancing(): Unit = {

  }

  override def increase(): Unit = {
    // 特质的叠加顺序，其实是从右到左
    // super 代表了该类的所有特质，和父类，但是调用都共有的方法时候，是从右边到左的
//    super.increase()
    // 可以指定想要调用某个父类(特质)的方法
//    super[Knowledge15].increase()
  }
}

